class A:
    def __init__(self):
        print('a')
    pass


class B(A):
    def __init__(self):
        # A.__init__(self)
        super().__init__()
        print('b')
    pass

class C(A):
    def __init__(self):
        # A.__init__(self)
        super(C,self).__init__()
        print('c')
    pass

class D(B,C):
    def __init__(self):
        super(D,self).__init__()
        """
        super的第一个参数应该是父类的上一个节点
        比如说链条如下
        (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
        你希望找到类C里面的方法，你应该找到上一个节点B
        
        第二个参数应该是一个实例对象，这个对象可以定位到整个mro链条
        比如说链条如下
        (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
        你希望找到类C里面的方法，
        你的这个对象至少要能查询到类B的整个Mro链条，也就是说由类D和类B创造出来的对象都可以接受
        """
        # B.__init__(self)
        # C.__init__(self)
        print('d')
    pass

d = D()
print(D.__mro__)

#这种继承方法会一定程度上造成代码的复写
"""
super是到mro的下一个节点去找寻对应的方法
在这个实例里面mro链条如下，顺序是DBCA
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
在代码的第29行调用了类D的构造方法，里面有个super
根据链条的规则，下一个类应该是类B
类B同样用到了super需要找下一个节点，类C
类c的下一个节点是类A
到此还没有然后的初始化，只是在找mro链条的下一个节点
找到类A之后，发现init方法是打印a，同样的逻辑输出的结果应该是逆向的也就是acbd
"""



